import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import squarify  # 用于绘制矩形树图

# 设置中文字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# ==============================================
# 1. 直方图：学生每餐平均消费金额
# ==============================================
#  1）早餐平均消费金额直方图
df_breakfast = pd.read_csv('D:/dataset/早餐平均消费情况.csv',header=0) # 修改为早餐数据文件
plt.figure(figsize=(10, 6))
plt.hist(df_breakfast['平均消费金额'], bins=20, edgecolor='black', alpha=0.7, color='#DA70D6')
plt.xlabel('平均消费金额（元）')
plt.ylabel('人数')
plt.title('学生早餐平均消费金额直方图')
plt.grid(axis='y', alpha=0.3)
plt.savefig('早餐平均消费金额直方图.png')
plt.show()
# ==============================================
# 2）午餐平均消费金额直方图
df_lunch  = pd.read_csv('D:/dataset/午餐平均消费情况 .csv',header=0)  # 修改为午餐数据文件
plt.figure(figsize=(10, 6))
plt.hist(df_lunch['平均消费金额'], bins=20, edgecolor='black', alpha=0.7, color='pink')
plt.xlabel('平均消费金额（元）')
plt.ylabel('人数')
plt.title('学生午餐平均消费金额直方图')
plt.grid(axis='y', alpha=0.3)
plt.savefig('午餐平均消费金额直方图.png')
plt.show()
# ==============================================
# 3)晚餐平均消费金额直方图
df_dinner = pd.read_csv('D:/dataset/晚餐平均消费情况 .csv',header=0)
plt.figure(figsize=(10, 6))
plt.hist(df_dinner['平均消费金额'], bins=20, edgecolor='black', alpha=0.7, color='#ADD8E6')
plt.xlabel('平均消费金额（元）')
plt.ylabel('人数')
plt.title('学生晚餐平均消费金额直方图')
plt.grid(axis='y', alpha=0.3)
plt.savefig('晚餐平均消费金额直方图.png')
plt.show()

# ==============================================
# 2. 散点图：每天平均消费金额和次数
# ==============================================
# 读取数据
df_daily = pd.read_csv('D:/dataset/每天消费金额与次数.csv',header=0)
plt.figure(figsize=(10, 6))
plt.scatter(df_daily['当天消费次数'], df_daily['当天消费金额'], alpha=0.6, color='red')
plt.xlabel('平均每天消费次数')
plt.ylabel('平均天消费金额（元）')
plt.title('每天平均消费金额与次数散点图')
plt.grid(True)
plt.savefig('每天消费金额与次数散点图.png')
plt.show()

# ==============================================
# 3. 饼图：各食堂消费金额和就餐人次
# ==============================================
# 1)饼图：各食堂消费金额占比
# ==============================================
df_pie_amount = pd.read_csv('D:/dataset/食堂营业额.csv',header=0)  # 修改为消费金额数据文件
total_amount = df_pie_amount['营业额'].sum()
df_pie_amount['占比'] = df_pie_amount['营业额'] / total_amount
plt.figure(figsize=(8, 8))
plt.pie(df_pie_amount['占比'], labels=df_pie_amount['消费地点'], autopct='%1.1f%%',
        explode=(0.1, 0, 0, 0, 0), shadow=True, colors=['#FF6347', '#4682B4', '#32CD32', '#ffcc99', '#c2c2f0'])
plt.title('各食堂营业额占比饼图')
plt.axis('equal')
plt.savefig('各食堂营业额占比饼图.png')
plt.show()
# ==============================================
# 2)饼图：各食堂就餐人次占比
df_pie = pd.read_csv('D:/dataset/食堂就餐人次占比饼图.csv',header=0)
plt.figure(figsize=(8, 8))
plt.pie(df_pie['就餐次数'], labels=df_pie['消费地点'], autopct='%1.1f%%', explode=(0.1, 0, 0, 0, 0), shadow=True, colors=['#FF4500', '#FFFFE0', '#90EE90', '#87CEEB', '#c2c2f0'])
plt.title('各食堂就餐人次占比饼图')
plt.axis('equal')
plt.savefig('各食堂就餐人次占比饼图.png')
plt.show()
# ==============================================
# 4. 热力图：4月各食堂每日营业额
# ==============================================
# 读取数据
df_heatmap = pd.read_csv('D:/dataset/各食堂4月份每日营业额.csv',header=0)
df_heatmap = df_heatmap.reset_index().melt(id_vars='index', var_name='日期', value_name='营业额')
df_heatmap['日期'] = pd.to_numeric(df_heatmap['日期'], errors='coerce').astype('Int64')
pivot_table = df_heatmap.pivot_table(index='日期', columns='index', values='营业额')

# 绘制热力图
plt.figure(figsize=(12, 8))
im = plt.imshow(pivot_table, cmap='viridis', interpolation='nearest', aspect='auto')

# 添加数值标签
for i in range(len(pivot_table.index)):
    for j in range(len(pivot_table.columns)):
        value = pivot_table.iloc[i, j]
        if pd.notna(value):  # 跳过缺失值
            plt.text(j, i, f'{value:.1f}', ha='center', va='center', fontsize=8, color='white')  # 数值保留1位小数

# 优化坐标轴显示
plt.xticks(range(len(pivot_table.columns)), pivot_table.columns, rotation=45, ha='right')
plt.yticks(range(len(pivot_table.index)), pivot_table.index.astype('str'), va='top')  # 日期标签靠上显示
plt.xlabel('食堂')
plt.ylabel('日期')
plt.title('4月各食堂每日营业额热力图')
plt.colorbar(im, shrink=0.8)  # 调整颜色条比例

plt.tight_layout()  # 自动调整布局
plt.savefig('4月各食堂每日营业额热力图.png', dpi=300)
plt.show()
# ==============================================
# 5. 折线图：各食堂工作日和周末就餐情况
# ==============================================
# 读取数据（假设工作日和周末数据分别在'weekday.csv'和'weekend.csv'中）
df_weekday = pd.read_csv('D:/dataset/工作日消费情况.csv',header=0)
df_weekend = pd.read_csv('D:/dataset/周末消费情况.csv',header=0)
df_weekday['消费时间'] = pd.to_datetime(df_weekday['消费时间'])
df_weekend['消费时间'] = pd.to_datetime(df_weekend['消费时间'])

# 绘制图表（转换为 NumPy 数组避免索引问题）
plt.figure(figsize=(10, 6))
plt.plot(np.array(df_weekday['消费时间']), np.array(df_weekday['消费次数']),
         label='工作日', marker='o', linestyle='-')
plt.plot(np.array(df_weekend['消费时间']), np.array(df_weekend['消费次数']),
         label='周末', marker='s', linestyle='--')

# 设置图表属性
plt.xlabel('消费时间')
plt.ylabel('消费次数')
plt.title('各食堂工作日与周末就餐情况对比')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)  # 旋转 x 轴标签避免重叠

# 保存并显示图表
plt.tight_layout()  # 确保布局完整
plt.savefig('工作日周末就餐情况折线图.png')
plt.show()

# ==============================================
# 6. 矩形树图：学生早中晚就餐地点情况
# ==============================================
# 读取数据（假设数据在'meal_location.csv'中，需按早中晚分组汇总）
df_treemap = pd.read_csv('D:/dataset/食堂早中晚就餐情况.csv',header=0)
plt.figure(figsize=(12, 8))
squarify.plot(
    sizes=df_treemap['就餐次数'],
    label=df_treemap['食堂'],
    color=plt.cm.Paired(range(len(df_treemap))),
    alpha=0.8,
    text_kwargs={'fontsize': 10}
)
plt.title('学生早中晚就餐地点矩形树图')
plt.axis('off')
plt.savefig('早中晚就餐地点矩形树图.png')
plt.show()